import copy

from fastapi import HTTPException
from sqlalchemy.orm import Session

from . import models, dataBaseModel, User, enum
from passlib.context import CryptContext

pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")


def get_user_by_id(db: Session, user_id: int) -> dataBaseModel.UserDBInfo | None:
    """
    获取用户信息--从用户id
    :param db: 数据库会话
    :param user_id: 用户id
    :return: 用户信息
    """
    return db.query(models.User).filter(
        models.User.id == user_id,
        models.User.status == enum.Status.normal
    ).first()


def get_user_by_username(db: Session, username: str) -> models.User | None:
    """
    获取用户信息--从用户名
    :param db: 数据库会话
    :param username: 用户名
    :return: 用户信息
    """
    # 查询数据库获取用户信息
    return db.query(models.User).filter(
        models.User.username == username,
        models.User.status == enum.Status.normal
    ).first()


def create_user(db: Session, user: dataBaseModel.UserCreate, role_id: int):
    """
    创建用户
    :param db: 数据库会话
    :param user: 创建用户所需信息
    :param role_id: 角色id
    :return: 返回新用户
    """
    # 深拷贝user
    create_user_info = copy.deepcopy(user)
    # 删除用户中的角色名
    del create_user_info.role_name
    # 密码转换哈希密码
    create_user_info.password = pwd_context.hash(create_user_info.password)
    # 将用户信息放入创建模板
    db_user = models.User(**create_user_info.model_dump())
    # 添加角色id
    db_user.role_id = role_id
    db.add(db_user)
    db.commit()  # 提交保存到数据库中
    db.refresh(db_user)  # 刷新
    db_user.role_name = db_user.role.name
    return db_user


def get_role_by_name(db: Session, role_name: str) -> dataBaseModel.RoleDBInfo | None:
    """
    从角色名获取角色信息
    :param db: 数据库会话
    :param role_name: 角色名
    :return: 角色信息
    """
    return db.query(models.Role).filter_by(name=role_name).first()


def get_role_by_id(db: Session, role_id: int) -> dataBaseModel.RoleDBInfo | None:
    """
    从id获取角色
    :param db:数据库会话
    :param role_id: 角色id
    :return: 角色信息
    """
    return db.query(models.Role).filter(models.Role.id == role_id).first()


def create_roles(db: Session, role: dataBaseModel.RoleCreate):
    """
    创建角色
    :param db: 数据库会话
    :param role: 角色名称
    :return:
    """
    # 将信息放入创建模板
    db_role = models.Role(**role.model_dump())
    db.add(db_role)
    db.commit()  # 提交保存到数据库中
    db.refresh(db_role)  # 刷新
    return db_role
